/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tsb.gestores;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Line2D;
import tsb.UI.Ventanas.Principal;
import java.util.ArrayList;
import java.util.Iterator;
import tsb.UI.PanelArrastrar.BotonPersonalizado;
import tsb.UI.PanelArrastrar.LineaConexion;
import tsb.UI.PanelArrastrar.PanelPrincipalV2;
import tsb.UI.arbol.panelArbolo;
import tsb.dominio.conexiones.*;
import tsb.dominio.dispositivos.Dispositivo;
import tsb.dominio.dispositivos.coneccion.DispositivoConeccion;
import tsb.dominio.dispositivos.coneccion.Router;
import tsb.dominio.dispositivos.coneccion.Switch;
import tsb.dominio.dispositivos.hosfinal.HostFinal;
import tsb.dominio.dispositivos.hosfinal.PC;
import tsb.dominio.dispositivos.hosfinal.Server;
import tsb.dominio.interfaces.Ethernet;
import tsb.dominio.interfaces.FibraOpticaFastEthernet;
import tsb.dominio.interfaces.FibraOpticaGigabit;
import tsb.dominio.interfaces.IP;
import tsb.dominio.interfaces.InterfaceDeConeccion;
import tsb.dominio.interfaces.InterfazModemPC;
import tsb.dominio.interfaces.RJ45FastEthernet;
import tsb.dominio.interfaces.RJ45Gigabit;
import tsb.dominio.interfaces.Serial;

/**
 *
 * @author Fede
 */
public class GestorGrafo
{
    
    private tsb.grafo.Grafo grafo;
    private boolean banderaInsertarGrafo=false;
    private boolean Router;
    public GestorGrafo()
    {

    }
    public void agregarDispositivo(tsb.dominio.dispositivos.hosfinal.HostFinal dispositivo)
    {
        if(banderaInsertarGrafo==false) //Instanciar el grafo y agregar el primer dispositivo
        {
            grafo= new tsb.grafo.Grafo(dispositivo);
            banderaInsertarGrafo=true;
        }
        else //Agrega al grafo creado anteriormente un nuevo dispositivo
        {
            grafo.insertarNodo(dispositivo);
            
        }
    }
    public void agregarDispositivo(tsb.dominio.dispositivos.coneccion.DispositivoConeccion dispositivo)
    {
        if(banderaInsertarGrafo==false) //Instanciar el grafo y agregar el primer dispositivo
        {
            grafo= new tsb.grafo.Grafo(dispositivo);
            banderaInsertarGrafo=true;
        }
        else //Agrega al grafo creado anteriormente un nuevo dispositivo
        {
            grafo.insertarNodo(dispositivo);

        }
    }
    public Dispositivo getDispositivo(String nombreAMostrar)
    {
        return grafo.getDispositivo(nombreAMostrar);
    }
    public boolean actualizarDispositivo(Dispositivo disp)
    {

       return grafo.actualizarDispositivo(disp);

    }

    public boolean agregarConexion(String origen, String destino, int tipo)
    {
        boolean resultado=false;

        Dispositivo dispOrigen= grafo.getDispositivo(origen);
        Dispositivo dispDestino=grafo.getDispositivo(destino);

        switch(tipo)
        {
            case 0:
                    resultado=false;
                    break;
            case 1:// RJ45
                    RJ45 rj= new RJ45(dispDestino,dispOrigen);
                    rj.setNombre("RJ45: "+origen+"/"+destino);
                    grafo.insertarConexion(rj);
                    resultado=true;
                    break;
            case 2://fibra
                    FibraOptica fibra= new FibraOptica(dispDestino, dispOrigen);
                    fibra.setNombre("Fibra Optica: "+origen+"/"+destino);
                    grafo.insertarConexion(fibra);
                    resultado=true;
                    break;
            case 3://SerialDCE
                    SerialDCE serialDCE= new SerialDCE(dispDestino, dispOrigen);
                    serialDCE.setNombre("Serial DCE: "+origen+"/"+destino);
                    grafo.insertarConexion(serialDCE);
                    resultado=true;
                    break;
            case 4://ethernetRJ11
                    ConexionTelefono rj11= new ConexionTelefono(dispDestino, dispOrigen);
                    rj11.setNombre("RJ11: "+origen+"/"+destino);
                    grafo.insertarConexion(rj11);
                    resultado=true;
                    break;
            case 5://wireless
                    Wireless wirel= new Wireless(dispDestino,dispOrigen);
                    wirel.setNombre("Wireless: "+origen+"/"+destino);
                    grafo.insertarConexion(wirel);
                    resultado=true;
                    break;
            case 6://Coaxial
                    Coaxial coa= new Coaxial(dispDestino,dispOrigen);
                    coa.setNombre("Coaxial: "+origen+"/"+destino);
                    grafo.insertarConexion(coa);
                    resultado=true;
                    break;
            case 7://Automatica
                    ConexionAutomatica conAut= new ConexionAutomatica(dispDestino,dispOrigen);
                    conAut.setNombre("Automatica: "+origen+"/"+destino);
                    grafo.insertarConexion(conAut);
                    resultado=true;
                    break;
            case 8://SerialDTE
                    SerialDTE serialDTE= new SerialDTE(dispDestino,dispOrigen);
                    serialDTE.setNombre("Serial DTE: "+origen+"/"+destino);
                    grafo.insertarConexion(serialDTE);
                    resultado=true;
                    break;
        }
        return resultado;
    }

    public boolean eliminarDispositivo(String nombreAMostrar)
    {
        return this.grafo.eliminarNodo(nombreAMostrar);
    }
    public tsb.grafo.Grafo getGrafo()
    {
        return this.grafo;
    }
    
    public boolean eliminarConexion(Conexion c)
    {
        return grafo.eliminarConexion(c);
    }
    
    public boolean eliminarConexion(String nombreAMostrar)
    {
        return grafo.eliminarConexion(nombreAMostrar);
    }
    
    public String toStringGrafo()
    {
        return grafo.toString();
    }
    
    public void generarIPconDHCP()
    {
        for(int i=0;i<grafo.getArrayDispositivos().size();i++)
        {
            Dispositivo d=grafo.getArrayDispositivos().get(i);
            
            if(d instanceof Router)
            {
                for(int j=0;j<grafo.getMatriz().getArrayConexiones().get(i).size();j++)
                {
                    Conexion c= grafo.getMatriz().getArrayConexiones().get(i).get(j);
                    
                    if(c!=null)
                    {
                        Dispositivo di=grafo.getArrayDispositivos().get(j);
                        
                        if(di instanceof PC)
                        {
                            PC pc=(PC)di;
                            
                            for(int h=0;h<pc.getInterfaces().size();h++)
                            {
                                InterfaceDeConeccion inte= pc.getInterfaces().get(h);
                                
                                if(inte instanceof Ethernet)
                                {
                                    Ethernet rj45=(Ethernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45FastEthernet)
                                {
                                    RJ45FastEthernet rj45=(RJ45FastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaFastEthernet)
                                {
                                    FibraOpticaFastEthernet rj45=(FibraOpticaFastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45Gigabit)
                                {
                                    RJ45Gigabit rj45=(RJ45Gigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaGigabit)
                                {
                                    FibraOpticaGigabit rj45=(FibraOpticaGigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof InterfazModemPC)
                                {
                                    InterfazModemPC rj45=(InterfazModemPC)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof Serial)
                                {
                                    Serial rj45=(Serial)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof tsb.dominio.interfaces.Wireless)
                                {
                                    tsb.dominio.interfaces.Wireless rj45=(tsb.dominio.interfaces.Wireless)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                            }
                            continue;
                        }
                        if(di instanceof Server)
                        {
                            Server pc=(Server)di;
                            
                            for(int h=0;h<pc.getInterfaces().size();h++)
                            {
                                InterfaceDeConeccion inte= pc.getInterfaces().get(h);
                                
                                if(inte instanceof Ethernet)
                                {
                                    Ethernet rj45=(Ethernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45FastEthernet)
                                {
                                    RJ45FastEthernet rj45=(RJ45FastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaFastEthernet)
                                {
                                    FibraOpticaFastEthernet rj45=(FibraOpticaFastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45Gigabit)
                                {
                                    RJ45Gigabit rj45=(RJ45Gigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaGigabit)
                                {
                                    FibraOpticaGigabit rj45=(FibraOpticaGigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof InterfazModemPC)
                                {
                                    InterfazModemPC rj45=(InterfazModemPC)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof Serial)
                                {
                                    Serial rj45=(Serial)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof tsb.dominio.interfaces.Wireless)
                                {
                                    tsb.dominio.interfaces.Wireless rj45=(tsb.dominio.interfaces.Wireless)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                            }
                            continue;
                        }
                        if(di instanceof Server)
                        {
                            Server pc=(Server)di;
                            
                            for(int h=0;h<pc.getInterfaces().size();h++)
                            {
                                InterfaceDeConeccion inte= pc.getInterfaces().get(h);
                                
                                if(inte instanceof Ethernet)
                                {
                                    Ethernet rj45=(Ethernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45FastEthernet)
                                {
                                    RJ45FastEthernet rj45=(RJ45FastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaFastEthernet)
                                {
                                    FibraOpticaFastEthernet rj45=(FibraOpticaFastEthernet)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof RJ45Gigabit)
                                {
                                    RJ45Gigabit rj45=(RJ45Gigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof FibraOpticaGigabit)
                                {
                                    FibraOpticaGigabit rj45=(FibraOpticaGigabit)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof InterfazModemPC)
                                {
                                    InterfazModemPC rj45=(InterfazModemPC)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof Serial)
                                {
                                    Serial rj45=(Serial)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                                if(inte instanceof tsb.dominio.interfaces.Wireless)
                                {
                                    tsb.dominio.interfaces.Wireless rj45=(tsb.dominio.interfaces.Wireless)inte;
                                    rj45.setIP(new IP(GestorGrafo.GenerarIP()));
                                    continue;
                                }
                            }
                            continue;
                        }
                    }
                }
            }
            
            
        }
        
    }
    
    private static int i=100;
    private static String GenerarIP()
    {
        i++;
        return "172.16.81."+i;
                
    }
    
    private int getIndiceIP(String ip)
    {
        for(int i=0; i<grafo.getArrayDispositivos().size();i++)
        {
            Dispositivo d= grafo.getArrayDispositivos().get(i);
            
            if(d instanceof HostFinal)
            {
                HostFinal hf=(HostFinal)d;
                
                Iterator iter=hf.getInterfaces().iterator();
                while(iter.hasNext())
                {
                    InterfaceDeConeccion in=(InterfaceDeConeccion)iter.next();
                    
                    if(in.getIP().toString().compareTo(ip)==0)
                    {
                      return i;  
                    }
                }
            }
        }
        return -1;
    }
    
    public boolean ping(String ipOrigen, String ipDestino)
    {
        
        int origen=this.getIndiceIP(ipOrigen);
        if(origen==-1)
        {
            return false;
        }
        
        if(this.conexiones(origen, ipDestino))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    private boolean conexiones(int origen,String ipDestino)
    {
        for(int j=0;j<grafo.getMatriz().getArrayConexiones().get(origen).size();j++)
        {
            if(origen<j)
            {
                Conexion c=grafo.getMatriz().getArrayConexiones().get(origen).get(j);
            
            if(c!=null)
            {
                Dispositivo d= grafo.getArrayDispositivos().get(j);
                
                if(d instanceof PC )
                {
                    PC pc=(PC)d;
                    
                    Iterator iter=pc.getInterfaces().iterator();
                    
                    while(iter.hasNext())
                    {
                        InterfaceDeConeccion ic=(InterfaceDeConeccion)iter.next();
                        if(ic.getIP().toString().compareTo(ipDestino)==0)
                        {
                            return true;
                        }
                    }
                }
                else
                {
                    return this.conexiones(j, ipDestino);
                }
            
            }
            }
            
            
        }
        return false;
    }
    
    

    public void dibujarGrafo(Principal ventana) {
        

            
        for(int i=0; i<grafo.getArrayDispositivos().size();i++)
        {
            Dispositivo d= grafo.getArrayDispositivos().get(i);
            
            if(d instanceof PC)
            {
                PC pc=(PC)d;
                BotonPersonalizado botonPC = new BotonPersonalizado(pc.getNombreAMostrar(),BotonPersonalizado.PC, new Point(pc.getX()-32,pc.getY()-32));
                botonPC.setPanelPrincipal(ventana.getPanelPrincipalV2());
                //PopupMenuConecciones popupConecciones = new PopupMenuConecciones(botonPC, this.gestorDisp);
                ventana.getPanelPrincipalV2().insertarBoton(botonPC,pc.getX(),pc.getY());
                ventana.getPanelPrincipalV2().getVentanaPrincipal().getPanelArbolo().addDispositivosFinales(panelArbolo.PC, pc.getNombreAMostrar());
                
                
                for(int j=0;j<grafo.getMatriz().getArrayConexiones().get(i).size();j++)
                {
                    Conexion c=grafo.getMatriz().getArrayConexiones().get(j).get(j);
                    if(c!=null)
                    {
                        
                        //obtener el dispositivo de la posicion i del array de dispositivos
                        Dispositivo di=grafo.getArrayDispositivos().get(j);
                        
                        if(c instanceof RJ45)
                        { 
                            //ventana.dibujarLinea(); 
                            LineaConexion linea= new LineaConexion(LineaConexion.ethernetRJ45,botonPC.getUbicacion(),new Point(di.getX(), di.getX()),botonPC);
                            botonPC.addConexion(linea);
                            linea.dibujar(ventana.getGraphics(),linea.getIni(),linea.getFin());
                            
                            ventana.getPanelPrincipalV2().addConexion(linea);
                            ventana.getPanelPrincipalV2().paintComponent(ventana.getGraphics());
                        }
                        
                        if(c instanceof ConexionAutomatica)
                        {}
                        
                        if(c instanceof SerialDCE)
                        {}
                        
                        if(c instanceof FibraOptica)
                        {}
                        
                        if(c instanceof SerialDTE)
                        {}
                    }
                    
                }
            }
        
        }
    }
}

        



    
